#include "Sq_List.h"
//数据操作的定义

//  顺序表的创建：
void Init_Sql_List(Sql_list *L)
{
    //数据清空
    memset(L, sizeof(L->data[0]) * MAX_SIZE, 0);
    // 初始化len
    L->len = 0;
}

//顺序表的判空
void IsEmpty_Sql_List(Sql_list *L)
{
    if (NULL==L)
    {
        printf("顺序表为NULL\n");
    }
    if (L->len==0)
    {
        printf("顺序表数据为空\n");
    }
}

//顺序表的判满
void IsFull_Sql_List(Sql_list *L)
{
    if (L->len == MAX_SIZE)
    {
        printf("顺序表已满!\n");
        return;
    }
}

// 顺序表的查找：
//按位查找
Element_data *find_by_index(Sql_list *L, int index)
{
    
    //返回对应下标的数据项
    return L->data;
    printf("%s\n",L->data[index-1].name);
}

// 按值查找
int find_by_name(Sql_list *L, char *name)
{
    //找到对应名字的下标
    for (int i = 0; i < L->len; i++)
    {
        if (name==L->data[i].name)
        {
            return i;//返回下标
        }
    }
   
}        



/** 尾插
 * 函数名 tail_del_list
 * 参数
 *      @L      需要插入的 静态表
 *      @data   需要插入的 数据项
 * 返回值
 *      无
 * 功能
 *      对静态表进行尾插
 */
void tail_insert_list(Sql_list *L, Element_data data)
{
    //判满
    IsFull_Sql_List(L);
    //插入
    L->data[L->len] = data;
    //迭代
    L->len++;
}

// 按位插
void pos_insert_list(Sql_list *L, int index, Element_data data)
{
    //安全检查
    if (NULL == L)
    {
        printf("表不存在\n");
    }
    //判满
    if (MAX_SIZE==L->len+1)
    {
        printf("顺序表已经满了!\n");
    }
    //判断插入的位置是否合理
    if (index <= 0||index>L->len)
    {
        printf("插入的位置有误!\n");
    }

    // 后移
    // 特别要注意index和i的区别,index从1开始,i从0开始
    for (int i = L->len; i>=index; i--)
    {
        L->data[i] = L->data[i-1]; // 从最后一个元素一直往后,移动到插入位置后一个元素
    }

    //插入到index位置上
    L->data[index-1] = data;

    //插入完成,表长加1
    L->len++;
}

/** 尾删
 * 函数名 tail_del_list
 * 参数
 *      @L 需要尾删的 静态表
 * 返回值
 *      无
 * 功能
 *      对静态表进行尾删
 */
void tail_del_list(Sql_list *L)
{
    //判空
    IsEmpty_Sql_List(L);
    //减减
    L->len--;
}
// 按位删
void pos_del_list(Sql_list *L, int index)
{
    // 安全判断
    if (NULL == L)
    {
        printf("表不存在\n");
    }
    // 判空
    IsEmpty_Sql_List(L);

    //删除位置是否合理
    if (index<=0 || index>L->len)
    {
        printf("删除的位置有误!\n");
    }

    // 前移
    for (int i = index-1; i < L->len; i++)
    {
        L->data[i] = L->data[i+1]; // 从最后一个元素一直往前移动到删除位置
    }
  
    // 删除完成,表长减1
    L->len--;
}

// 顺序表的清空：
void Clear_Sql_List(Sql_list *L)
{
    //安全判断
    IsEmpty_Sql_List(L);
    // 数据清空
    memset(L, sizeof(L->data[0]) * MAX_SIZE, 0);
    // len置为0
    L->len = 0;
}


/** 遍历打印
 * 函数名 printf_Sql_List
 * 参数
 *      @L 需要遍历的 静态表
 * 返回值
 *      无
 * 功能
 *      对静态表进行打印
 */
void printf_Sql_List(Sql_list *L)
{
    //判空则不打印
    IsEmpty_Sql_List(L);
    for (int i = 0; i < L->len; i++)
    {
        printf("姓名:%s 性别:%s 年龄:%d 成绩:%d 学号:%d\n",L->data[i].name, L->data[i].sex, L->data[i].age,
                                                        L->data[i].grade, L->data[i].id);
    }
}